package geral.exception;

import geral.util.FacesUtil;

import java.util.Iterator;

import javax.faces.FacesException;
import javax.faces.application.Application;
import javax.faces.application.NavigationHandler;
import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExceptionHandlerWrapper;
import javax.faces.context.FacesContext;
import javax.faces.event.ExceptionQueuedEvent;
import javax.faces.event.ExceptionQueuedEventContext;

import seguranca.manager.SegurancaManager;

public class ErpExceptionHandler extends ExceptionHandlerWrapper {
	
	  private ExceptionHandler wrapped;

	  public ErpExceptionHandler(ExceptionHandler wrapped) {
	    this.wrapped = wrapped;
	  }

	  @Override
	  public ExceptionHandler getWrapped() {
	    return wrapped;
	  }

	  @Override
	  public void handle() throws FacesException {
	    //iterar nas exceptions não tratadas
	    Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator();
	    while (i.hasNext()) {
	      ExceptionQueuedEvent event = i.next();
	      ExceptionQueuedEventContext context =
	        (ExceptionQueuedEventContext)event.getSource();

	      Throwable t = context.getException();

	      //Tratar exception, redirecionar, ignorar, etc...
	      try{
			System.out.println("********************************************************");
	        System.out.println("DEBUG EXCEPTION CAPTURADA: ");
	        t.printStackTrace();
	        System.out.println("********************************************************");

	        String destino = "login";      
	        
	        if(t.getMessage().contains("javax.enterprise.context.NonexistentConversationException")){        	
	        	destino = "login";
	        	FacesUtil.mensInfo("Tempo de sessão expirada. Faça login novamente.");
	        }
	        
	        if(t.getMessage().contains("org.jboss.weld.context.NonexistentConversationException")){
	        	destino = "login";
	        	FacesUtil.mensInfo("Tempo de sessão expirada. Faça login novamente.");
	        }
	       
	        if(t.getMessage().contains("java.lang.IllegalStateException")){
	        	destino = "login";
	        	FacesUtil.mensInfo("Tempo de sessão expirada. Faça login novamente.");
	        }
	        
	       if (t.getMessage().contains("geral.exception.SegurancaException")){
	    	   destino = "/erro_permissao.xhtml";
	       }
	       
	       
	        
			// Redireciona para a pagina que a variável destino está indicando
	       FacesContext facesContext = FacesContext.getCurrentInstance();
	       SegurancaManager manager = (SegurancaManager) facesContext.getApplication().evaluateExpressionGet(facesContext,"#{segurancaManager}", SegurancaManager.class);
	       if(manager != null)
	    	   manager.logout();
	       
	       
	       navigateToView(facesContext, destino);      
			
		} finally{
	        //tratada, remove-la
	        i.remove();
	      }
	    }
	    getWrapped().handle();
	  }
	  
	  private void navigateToView(FacesContext context, String view) {
          Application application = context.getApplication();
          NavigationHandler navigationHandler = application.getNavigationHandler();
          navigationHandler.handleNavigation(context, null, view);
  }
}
